﻿using System;
using System.Collections.Generic;

namespace Laurent_Data_Mudanca_Requisito_02
{
	public class LastWorkingDays
	{

		public List<DateTime> getLast7WorkingDays( DateTime date )
		{
			if( !isValidDate( date ) )
			{
				throw new Exception( "A data informada não é válida, por isso não foi possível retornar os últimos 7 dias úteis." );
			}

			return getLastDays( date, 7, true );
		}

		public List<DateTime> getLastWorkingDay( DateTime date )
		{
			if( !isValidDate( date ) )
			{
				throw new Exception( "Data inválida." );
			}

			return getLastDays( date, 1, true );
		}

		public List<DateTime> getLast5Days( DateTime date )
		{
			if( !isValidDate( date ) )
			{
				throw new Exception( "Não foi possivel os últimos 5 dias corridos, favor informar uma data válida" );
			}

			return getLastDays( date, 5, false );
		}

		public List<DateTime> getLast7Days( DateTime date )
		{
			if( !isValidDate( date ) )
			{
				throw new Exception( "Favor informar uma data válida" );
			}

			return getLastDays( date, 7, false );
		}

		public List<DateTime> getLast30Days( DateTime date )
		{
			if( !isValidDate( date ) )
			{
				throw new Exception( "Impossível recuperar os últimos 30 dias corridos  a partir de uma data inválida." );
			}

			return getLastDays( date, 30, false );
		}

		public List<DateTime> getLastDays( DateTime date, Int32 days, Boolean workingDays )
		{
			List<DateTime> _listDate = new List<DateTime>();
			List<DateTime> _listHoliday = null;
			Int32 _days = 0;

			loadListHoliday( ref _listHoliday );

			while( _days < days )
			{
				date = date.AddDays( -1 );

				if( workingDays )
				{
					if( date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday )
					{
						continue;
					}

					if( _listHoliday.Contains( date ) )
					{
						continue;
					}
				}

				_listDate.Add( date );
				_days++;
			}

			return _listDate;
		}

		private void loadListHoliday( ref List<DateTime> listHoliday )
		{
			listHoliday = new List<DateTime>();

			listHoliday.Add( new DateTime( 2012, 1, 1 ) );
			listHoliday.Add( new DateTime( 2012, 2, 21 ) );
			listHoliday.Add( new DateTime( 2012, 12, 25 ) );
			listHoliday.Add( new DateTime( 2012, 12, 31 ) );
		}

		public Boolean IsWorkingDay( DateTime dateTime )
		{
			List<DateTime> _listHoliday = null;

			return !_listHoliday.Contains( dateTime );
		}

		public Boolean IsHoliday( DateTime dateTime )
		{
			List<DateTime> _listHoliday = null;

			return _listHoliday.Contains( dateTime );
		}

		private Boolean isValidDate( DateTime dateTime )
		{
			return dateTime.Year == 2012;
		}

	}
}
